package n92_任务调度线程池;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.Timer;
import java.util.TimerTask;

/**
 * @author fu
 * @date 2022-04-02 21:55
 * 概要：
 * ---------------------------------------------------------------
 * |                                                              |
 * |            主要是  Timer 的优点在于简单易用，但
 * 由于所有任务都是由同一个线程来调度，因此所有任务都是串行执行的，同一时间只能有一个任务在执行，前一个
 * 任务的延迟或异常都将会影响到之后的任务    |
 * |                                                             |
 * |=============================================================
 */
@Slf4j(topic = "c.T2")
public class T1_Timer的缺点 {


    public static void main(String[] args) {

//        _test_Timer_串行();
        _test_Timer_前面异常_终止后面执行();

    }

    /**
     * 证明 Timer 串行执行
     */
    private static void _test_Timer_串行() {
        Timer timer = new Timer();
        TimerTask task1 = new TimerTask() {
            @SneakyThrows
            @Override
            public void run() {
                log.debug("task 1");
                Thread.sleep(2000);
            }
        };
        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
                log.debug("task 2");
            }
        };
        log.debug("---start---");
        // 使用 timer 添加两个任务，希望它们都在 1s 后执行
        // 但由于 timer 内只有一个线程来顺序执行队列中的任务，因此『任务1』的延时，影响了『任务2』的执行
        timer.schedule(task1, 1000);
        timer.schedule(task2, 1000);
    }

    /**
     * 证明 Timer 前后面任务异常 影响后面执行
     */
    private static void _test_Timer_前面异常_终止后面执行() {
        Timer timer = new Timer();
        TimerTask task1 = new TimerTask() {
            @SneakyThrows
            @Override
            public void run() {
                log.debug("task 1");
                Thread.sleep(2000);
                int i = 1/0;
            }
        };
        TimerTask task2 = new TimerTask() {
            @Override
            public void run() {
                log.debug("task 2");
            }
        };
        log.debug("---start---");
        // 使用 timer 添加两个任务，希望它们都在 1s 后执行
        // 但由于 timer 内只有一个线程来顺序执行队列中的任务，因此『任务1』的延时，影响了『任务2』的执行
        timer.schedule(task1, 1000);
        timer.schedule(task2, 1000);
    }


}
